﻿using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Input;
using Sinacor.Infra.UI.Controls;
using Sinacor.UI.Bovespa.Ordens.Presenter;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.Ordens.Model;
using Sinacor.Infra.UI.Common;
using System.Collections.Generic;
using Sinacor.UI.Bovespa.Ordens.Model.Enum;
using Sinacor.UI.Bovespa.Clientes.View.SmartClient;
using Sinacor.UI.Bovespa.Clientes.Model;
using System.IO;
using System.Reflection;

namespace Sinacor.UI.Bovespa.Ordens.View.SmartClient
{
    public partial class ConsultaOrdensNegocios : SinacorWindow, IOrdensNegocios
    {
        #region Variaveis de Classe

        private OrdensNegociosPresenter _presenter;
        private Model.ConsultaOrdensNegocios _model;
        bool _realizarPesquisa = true;
        private string _style = string.Empty;
        private string _apelidoCliente = string.Empty;

        #endregion

        #region Construtor

        public ConsultaOrdensNegocios()
        {
            this.InitializeComponent();
            this.datagridOrdens.NewItemType = typeof(Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios);
            this.datagridNegocios.NewItemType = typeof(Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios);
            this.AfterInitialize += new RoutedEventHandler(ConsultaOrdensNegocios_AfterInitialize);
        }

        private void ConsultaOrdensNegocios_BeforeInitialize(object sender, RoutedEventArgs e)
        {
            this._presenter = new OrdensNegociosPresenter(this);
            this._model = new Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios();
        }

        private void ConsultaOrdensNegocios_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this._presenter = new OrdensNegociosPresenter(this);
            //this.ShowUserWaitingProcess();
            this._presenter.CarregaCalendario();
            //this.HideUserWaitingProcess();
        }

        #endregion

        #region Funcoes Publicas

        public void ExibirCalendario(IEnumerable datas)
        {
            this.ShowUserWaitingProcess();
            this.comboData.ItemsSource = datas;
            this.comboData.SelectedIndex = 0;
            this.HideUserWaitingProcess();
        }

        public void CarregarOrdensNegocio(Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios model)
        {
            ShowUserWaitingProcess();
            this._presenter = new OrdensNegociosPresenter(this);
            this._presenter.CarregarOrdensNegocio(model);
            HideUserWaitingProcess();
        }

        public void CarregarNegocios(Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios model)
        {
            this.ShowUserWaitingProcess();
            this._presenter = new OrdensNegociosPresenter(this);
            this._presenter.CarregarNegocios(model);
            this.HideUserWaitingProcess();
        }

        public void CarregarOrdens(Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios model)
        {
            this.ShowUserWaitingProcess();
            this._presenter = new OrdensNegociosPresenter(this);
            this._presenter.CarregarOrdens(model);
            this.HideUserWaitingProcess();
        }

        public void CarregarGridOrdensNegocios(Model.ConsultaOrdensNegocios model)
        {
            this.ShowUserWaitingProcess();
            this._presenter = new OrdensNegociosPresenter(this);
            this._presenter.CarregarGridOrdensNegocios(model);
            this.HideUserWaitingProcess();
        }

        public void CarregarNegociosOrdem(object selectedItem)
        {
            this.ShowUserWaitingProcess();
            DateTime dataPregao = Convert.ToDateTime(comboData.SelectedValue);
            this._presenter.CarregarNegociosOrdem(selectedItem, dataPregao);
            this.HideUserWaitingProcess();
        }

        public void ExibirOrdens(IEnumerable Ordens)
        {
           this.LimparGridOrdens();
           this.datagridOrdens.ItemsSource = Ordens;
        }

        public void ExibirOrdens(List<ModelConsultaOrdensNegocios> listModelOrdensNegocios)
        {
            throw new NotImplementedException();
        }

        public void ExibirNegocios(IEnumerable Negocios)
        {
            this.LimparGridNegocios();
            this.datagridNegocios.ItemsSource = Negocios;
        }

        public void ExibirNegocios(List<ModelNegocio> Negocios)
        {
            throw new NotImplementedException();
        }

        public void InformarTipoSituacaoCasamentoCasadas()
        {
            _style = BaseRow.GridRowBusiness02;
        }

        public void InformarTipoSituacaoCasamentoNaoCasadas()
        {
            _style = BaseRow.GridRowBusiness06;
        }

        public void InformarTipoSituacaoCasamentoCasadasParte()
        {
            _style = BaseRow.GridRowBusiness04;
        }

        public void InformarTipoSituacaoCasamentoExecutadasSemClientes()
        {
            _style = BaseRow.GridRowBusiness07;
        }

        public void InformarQuantidadeCasadaNula()
        {
            _style = BaseRow.GridRowBusiness06;
        }
       
        public void InformarQuantidadeCasada()
        {
            _style = BaseRow.GridRowBusiness02;
        }

        public void LimparGridNegocios()
        {
            this.datagridNegocios.ItemsSource = null;
        }

        public void LimparGridOrdens()
        {
            this.datagridOrdens.ItemsSource = null;
        }

        //public void ExibirMensagem(string mensagem)
        //{
        //    SinacorMessageBox.Show(mensagem, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        //}

        //public void ExibirMensagem(Model.Enum.Mensagem mensagem)
        //{
        //    this.ExibirMensagem(mensagem, "");
        //}

        //public void ExibirMensagem(Model.Enum.Mensagem mensagem, string complemento)
        //{
        //    string mensagemAuxiliar = "";
        //    switch (mensagem)
        //    {
        //        case Model.Enum.Mensagem.SemRetorno:
        //            mensagemAuxiliar = this.FindResource("Bovespa.Ordens.Message.MessageBox_PT_SelecionarTitulo").ToString();
        //            break;
        //        case Model.Enum.Mensagem.ConsultaSemResultado:
        //            mensagemAuxiliar = this.FindResource("Bovespa.Ordens.Message.MessageBox_RegistroNaoEncontrado").ToString();
        //            break;
        //    }
        //    SinacorMessageBox.Show(mensagemAuxiliar, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        //}

        public void ExibirMensagem(Model.Enum.TipoConsultaOrdemNegocio tipoConsulta)
        {
            string mensagem = "";
            switch (tipoConsulta)
            {
                case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoConsultaOrdemNegocio.Negocios:
                    mensagem = this.FindResource("Bovespa.Ordens.Message.NegocioNaoEncontrado").ToString();
                    break;
                case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoConsultaOrdemNegocio.Ordens:
                    mensagem = this.FindResource("Bovespa.Ordens.Message.OrdemNaoEncontrada").ToString();
                    break;
                case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoConsultaOrdemNegocio.Todas:
                    mensagem = this.FindResource("Bovespa.Ordens.Message.PesquisaSemRetorno").ToString();
                    break;
            }
            SinacorMessageBox.Show(mensagem,SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #region Exibir Mensagem By ResourceKey

        public void ExibirMensagemByResourseKey(string resourceKey)
        {
            string message = Convert.ToString(this.TryFindResource(resourceKey));

            if (!String.IsNullOrEmpty(message))
                SinacorMessageBox.Show(message);
        }
        #endregion

        public void ExibirAtivo(Model.Titulo modelTitulo)
        {
            if (modelTitulo != null)
            {
                this.textPapel.Text = modelTitulo.Codigo;
            }
        }

        #endregion
        
        #region Funcoes Privadas
        
        private void AlterarFormaSincronismo()
        {
            if (checkSincronismoAutomatico!=null &&  checkSincronismoAutomatico.IsChecked == true)
                this.Consultar(this._model);
        }

        private void NovaBusca()
        {
            this.HabilitarCampos(true);
            this.comboData.SelectedIndex = 0;
            this.radioTodas.IsChecked = true;

            _realizarPesquisa = false;
            this.radioSemSincronismo.IsChecked = true;
            _realizarPesquisa = true;

            this.VisualizarCliente(true);
        }

        private void Consultar(Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios model)
        {
            model = new Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios();

            if (this.radioCasadas != null && this.radioCasadas.IsChecked.Value)
                model.TipoSituacao = Model.Enum.TipoSituacaoOrdem.Casadas;
            else if (this.radioCasadasParte != null && this.radioCasadasParte.IsChecked.Value)
                model.TipoSituacao = Model.Enum.TipoSituacaoOrdem.CasadasParte;
            else if (this.radioNaoCasadas != null && this.radioNaoCasadas.IsChecked.Value)
                model.TipoSituacao = Model.Enum.TipoSituacaoOrdem.NaoCasadas;
            else
                model.TipoSituacao = Model.Enum.TipoSituacaoOrdem.Todas;

            model.Bolsa = this.textBolsa.Text;
            model.ApelidoCliente = this.textCliente.Text;
            model.DataPregao = Convert.ToDateTime(this.comboData.SelectedValue);
            model.Titulo = this.textPapel.Text;
       

            if (model.DataPregao.HasValue)
            {
                if (radioOrdensNegocios.IsChecked == true)
                {
                    this.CarregarOrdens(model);
                    this.datagridNegocios.ItemsSource = null;
                }
                else if (radioNegociosOrdens.IsChecked == true)
                {
                    this.CarregarNegocios(model);
                    this.datagridOrdens.ItemsSource = null;
                }
                else
                {
                    this.CarregarGridOrdensNegocios(model);
                }
            }
            else
            {
                StringBuilder err = new StringBuilder();
                if (!model.DataPregao.HasValue)
                {
                    this.ShowError("Bovespa.Ordens.Message.MsnDataPregao");
                }
            }
        }

        private void HabilitarCampos(bool condicao)
        {
            textBolsa.IsEnabled = condicao;
            textCliente.IsEnabled = condicao;
            textPapel.IsEnabled = condicao;
            comboData.IsEnabled = condicao;
            groupSituacaoOrdens.IsEnabled = condicao;
        }

        private void SincronizarNegociosPorOrdem(Model.ConsultaOrdensNegocios model)
        {
            if (!this.radioSemSincronismo.IsChecked.Value)
            {
                if (this.radioOrdensNegocios.IsChecked.Value)
                {
                    if (datagridOrdens.SelectedItems != null && datagridOrdens.SelectedItems.Count > 0)
                    {
                        this.CarregarNegociosOrdem(datagridOrdens.SelectedItems[0]);
                    }
                    else
                    {
                        datagridNegocios.ItemsSource = null;
                    }
                }
            }
        }

        private void SincronizarOrdensPorNegocio(Model.ConsultaOrdensNegocios model)
        {
            if (!this.radioSemSincronismo.IsChecked.Value)
            {
                if (this.radioNegociosOrdens.IsChecked.Value)
                {
                    if (datagridNegocios.SelectedItems != null && datagridNegocios.SelectedItems.Count > 0)
                    {
                        model = new Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios();
                        model.NegocioSelecionado = (Model.Negocio)datagridNegocios.SelectedItems[0];
                        model.DataPregao = Convert.ToDateTime(this.comboData.SelectedValue);
                        this.CarregarOrdensNegocio(model);
                    }
                    else
                    {
                        datagridOrdens.ItemsSource = null;
                    }
                }
            }
        }

        private void VisualizarCliente(bool visibilidade)
        {
            if (visibilidade == false)
            {
                this._apelidoCliente = this.textCliente.Text;
                this.textCliente.IsEnabled = false;
                this.textCliente.Clear();
            }
            else
            {
                this.textCliente.IsEnabled = true;
                if (this.textCliente.Text == string.Empty)
                    this.textCliente.Text = this._apelidoCliente;
            }
        }

        private void AbrirManutencaoDeOrdens(Model.ConsultaOrdensNegocios model)
        {
            Model.ConsultaOrdensNegocios ordem;
            FileInfo fiView;
            FileInfo fiModel;
            Assembly aView;
            Assembly aModel;
            Type typeView;
            Type typeModel;
            object parameter;
            object instance;
            List<string> listMenu;
            PropertyInfo menuHeader;
            PropertyInfo owner;
            MethodInfo method;
            List<SinacorWindow> listWindow;
            bool achouTela;
            Sinacor.Infra.UI.Desktop.SmartClient.DesktopVirtual virtualDesktop;

            if (datagridOrdens.SelectedItems != null 
                && datagridOrdens.SelectedItems.Count > 0)
            {
                ordem = (Model.ConsultaOrdensNegocios)this.datagridOrdens.SelectedItem;

                fiView = new FileInfo(@"Bovespa\Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient.dll");
                fiModel = new FileInfo(@"Bovespa\Sinacor.UI.Bovespa.ManutencaoOrdens.Model.dll");

                if (fiView.Exists
                    && fiModel.Exists)
                {
                    aModel = Assembly.Load("Sinacor.UI.Bovespa.ManutencaoOrdens.Model");
                    typeModel = aModel.GetType("Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem", false);

                    if (typeModel != null)
                    {
                        aView = Assembly.Load("Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient");
                        typeView = aView.GetType("Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient.ManutencaoOrdens", false);

                        if (typeView != null)
                        {
                            virtualDesktop = Sinacor.Infra.UI.Desktop.SmartClient.DesktopVirtual.GetInstance();
                            achouTela = false;

                            listWindow = virtualDesktop.GetDesktopVirtual(_presenter.Session.TokenId);

                            foreach (SinacorWindow window in listWindow)
                            {
                                if (window.GetType() == typeView)
                                {
                                    window.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                                                                new Action(delegate()
                                                                {
                                                                    window.Activate();
                                                                }));
                                    achouTela = true;
                                    break;
                                }
                            }

                            if (achouTela)
                            {
                                SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.ManutencaoOrdensAberta").ToString(), SinacorMessageBoxImage.Information);
                            }
                            else
                            {
                                parameter = Activator.CreateInstance(typeModel, new object[] { ordem.DataOrdem, ordem.Numero, ordem.NumeroOrdemSubSequencia });

                                if (parameter != null)
                                {
                                    instance = Activator.CreateInstance(typeView, new object[] { parameter });

                                    if (instance != null)
                                    {
                                        listMenu = new List<string>();
                                        listMenu.Add("RESOURCEKEY");

                                        menuHeader = typeView.GetProperty("MenuHeader");

                                        if (menuHeader != null)
                                            menuHeader.SetValue(instance, listMenu, null);

                                        owner = typeView.GetProperty("Owner");

                                        if (owner != null)
                                            owner.SetValue(instance, this, null);

                                        method = typeView.GetMethod("ShowDialog");

                                        if (menuHeader != null && owner != null && method != null)
                                            method.Invoke(instance, null);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private void AbrirCadastramentoNegocio(Model.ConsultaOrdensNegocios model)
        {
            if (datagridNegocios.SelectedItems != null && datagridNegocios.SelectedItems.Count > 0)
            {
                CadastramentoNegocio cadastramentoNegocio = new CadastramentoNegocio();
                Model.Negocio negocio;
                Model.ModelCadastroNegocio modelCadastroNegocio = new Sinacor.UI.Bovespa.Ordens.Model.ModelCadastroNegocio();
                negocio = (Model.Negocio)datagridNegocios.SelectedItems[0];
                modelCadastroNegocio.Numero = negocio.NumeroNegocio;
                modelCadastroNegocio.DataPregao = negocio.DataPregao;
                modelCadastroNegocio.TituloCodigo = negocio.CodigoTitulo;
                modelCadastroNegocio.TipoNaturezaOperacao = negocio.TipoNaturezaOperacao;
                modelCadastroNegocio.Bolsa = negocio.Bolsa;
                cadastramentoNegocio.CarregarParametros(modelCadastroNegocio);
                cadastramentoNegocio.SetMenuHeader("Bovespa.Ordens.Label.CasamentoPreBoleto");
                cadastramentoNegocio.Owner = this;
                cadastramentoNegocio.ShowDialog();
            }
        }

        private void AbrirPesquisaAtivos()
        {
            this.ClearServiceErrors();
            Model.Titulo modelTitulo = new Model.Titulo();
            modelTitulo.Codigo = this.textPapel.Text;

            if (this.comboData.SelectedValue != null)
            {
                modelTitulo.DataPregao = Convert.ToDateTime(this.comboData.Text);
            }
            else
            {
                this.ExibirMensagemByResourseKey("Bovespa.Ordens.Message.DataPregaoObrigatorio");
                return;
            }

            PesquisaTitulo pesquisaTitulo = new PesquisaTitulo();
            pesquisaTitulo.CarregarParametros(modelTitulo, TelaChamadora.ConsultaOrdensNegocios);
            pesquisaTitulo.Owner = this;
            pesquisaTitulo.SetMenuHeader("Bovespa.Ordens.Label.PesquisaTitulo");
            pesquisaTitulo.ShowDialog();

            if (pesquisaTitulo.TituloEscolhido != null)
            {
                this.ExibirAtivo(pesquisaTitulo.TituloEscolhido);
            }
        }

        private void AbrirPesquisaClientes()
        {
            this.ClearServiceErrors();
            PesquisaClientes pesquisaClientes = new PesquisaClientes();

            pesquisaClientes.CarregaParametros(Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada.ConsultaOrdensNegocios, null);
            pesquisaClientes.Owner = this;
            pesquisaClientes.SetMenuHeader("Bovespa.Clientes.Label.PesquisaClientesMenuHeader");
            pesquisaClientes.ShowDialog();

            if (pesquisaClientes.PesquisaClienteModel.Apelido != null)
            {
                this.textCliente.Text = pesquisaClientes.PesquisaClienteModel.Apelido;
            }
        }

        private void LimparCampos()
        {
            this.comboData.SelectedIndex = 0;
            this.radioTodas.IsChecked = true;
            this.radioSemSincronismo.IsChecked = true;
            this.checkSincronismoAutomatico.IsChecked = false;
            this.textBolsa.Clear();
            this.textCliente.Clear();
            this.textPapel.Clear();

            this.comboData.UpdateLayout();
            this.radioTodas.UpdateLayout();
            this.radioSemSincronismo.UpdateLayout();
            this.textBolsa.UpdateLayout();
            this.textCliente.UpdateLayout();
            this.textPapel.UpdateLayout();

            this.datagridOrdens.ItemsSource = null;
            this.datagridOrdens.UpdateLayout();
            this.datagridNegocios.ItemsSource = null;
            this.datagridNegocios.UpdateLayout();
        }

        #endregion

        #region Funcoes de Evento

        private void buttonPesquisar_Click(object sender, RoutedEventArgs e)
        {            
            this.ClearServiceErrors();
            this.Consultar(this._model);
        }

        private void radioSemSincronismo_Checked(object sender, RoutedEventArgs e)
        {
            VisualizarCliente(true);
            if (_realizarPesquisa)
                this.AlterarFormaSincronismo();
        }

        private void radioOrdensNegocios_Checked(object sender, RoutedEventArgs e)
        {
            VisualizarCliente(true);
            this.AlterarFormaSincronismo();
        }

        private void radioNegociosOrdens_Checked(object sender, RoutedEventArgs e)
        {
            VisualizarCliente(false);
            this.AlterarFormaSincronismo();
        }

        private void GridNegocios_DoubleClick(object sender, MouseButtonEventArgs e)
        {
            BaseCell cell = (BaseCell)ControlHelper.FindParent((DependencyObject)e.OriginalSource, typeof(BaseCell));
            if (this.datagridNegocios.SelectedIndex < 0 || cell == null)
            { 
                return; 
            }
            else
            {
                datagridNegocios.IsEnabled = false;
                this.AbrirCadastramentoNegocio(this._model);
                datagridNegocios.IsEnabled = true;
            }
        }
        
        private void GridOrdens_DoubleClick(object sender, MouseButtonEventArgs e)
        {
            BaseCell cell = (BaseCell)ControlHelper.FindParent((DependencyObject)e.OriginalSource, typeof(BaseCell));
            if (cell == null
                || this.datagridOrdens.SelectedIndex < 0
                || this.datagridNegocios.IsEditing)
            {
                return;
            }
            else
            {
                datagridOrdens.IsEnabled = false;
                this.AbrirManutencaoDeOrdens(this._model);
                datagridOrdens.IsEnabled = true;

                this.ClearServiceErrors();
                this.Consultar(this._model);
            }
        }

        private void FiltroTextBox_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                this.Consultar(this._model);
            }
        }
        
        void datagridOrdens_BufferedSelectionChanged(object sender, BufferedEventArgs<System.Windows.Controls.SelectionChangedEventArgs> e)
        {
            this.ClearServiceErrors();
            this.SincronizarNegociosPorOrdem(this._model);
        }

        void datagridNegocios_BufferedSelectionChanged(object sender, BufferedEventArgs<System.Windows.Controls.SelectionChangedEventArgs> e)
        {
            this.ClearServiceErrors();
            this.SincronizarOrdensPorNegocio(this._model);
        }

        void comboData_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            if (((SinacorComboBox)sender).SelectedItem == null)
            {
                comboData.SelectedIndex = comboData.Items.IndexOf(e.RemovedItems[0].ToString());
            }
        }

        private void datagridOrdens_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is BaseRow)
                {
                    this._presenter.InformarStatusModelOrdem(((Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios)(e.ItemInfo.Item)).TipoSituacao);
                    this._presenter.InformarOrdemCapa((Sinacor.UI.Bovespa.Ordens.Model.ConsultaOrdensNegocios)e.ItemInfo.Item);
                }
                e.Style = _style;
            }
        }

        private void datagridNegocios_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is BaseRow)
                {
                    this._presenter.InformarStatusModelNegocio(((Sinacor.UI.Bovespa.Ordens.Model.Negocio)(e.ItemInfo.Item)).TipoSituacao);
                }
                e.Style = _style;
            }
        }

        private void BtnPesquisaTitulo_Click(object sender, RoutedEventArgs e)
        {
            this.AbrirPesquisaAtivos();
        }

        private void BtnPesquisaCliente_Click(object sender, RoutedEventArgs e)
        {
            this.AbrirPesquisaClientes();
        }

        private void BtnNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            this.LimparCampos();
        }
        
        #endregion
     }
}
